Logotipo da disciplina PAG014903

Fundamentos de Programação em Python

v0.0.2

Padrão

Dando Inteligência ao Código — Decisões e Loops

Transforme scripts lineares em sistemas que tomam decisões, repetem tarefas automaticamente e respondem a cenários complexos.

Você vai aprender a

  • Configurar blocos if/elif/else para controlar o fluxo.
  • Automatizar tarefas com laços for e while.
  • Usar break e continue para refinar algoritmos.

3.1 Introdução: Deixando o Código "Pensar"

Até aqui, nossos programas seguiram uma sequência rígida de instruções, executando tudo em linha reta. A verdadeira força da programação, porém, surge quando permitimos que o código reaja aos dados, tome decisões e repita ações automaticamente.

Neste capítulo, exploramos as duas estruturas que dão essa inteligência ao Python:

  • Blocos de decisão (if): escolhem caminhos diferentes com base em condições.
  • Laços de repetição (loops): repetem tarefas sem esforço manual.

Com elas, nossa “estrada reta” passa a ter desvios, cruzamentos e retornos controlados, permitindo construir soluções autônomas e robustas.

3.2 Estruturas de Decisão: Aprofundando no if

O bloco if/elif/else funciona como um guarda de trânsito, direcionando o fluxo conforme os dados. Para isso, ele depende de operadores de comparação que retornam valores booleanos (True ou False).

Operadores de Comparação

Operador Descrição Exemplo (a = 5) Resultado
== É igual a? a == 5 True
!= É diferente de? a != 3 True
> É maior que? a > 4 True
< É menor que? a < 5 False
>= É maior ou igual a? a >= 5 True
<= É menor ou igual a? a <= 4 False

3.2.1 Do if Simples ao if/elif/else

  1. if simples: executa o bloco apenas quando a condição é verdadeira.

    # Exemplo: Classificação de Risco Geológico
                                    declividade = 35  # em graus
    
                                    # Apenas executa a ação se a declividade for considerada de risco
                                    if declividade > 30:
                                        print("Alerta: Risco alto de deslizamento devido à declividade acentuada.")
  2. if/else: oferece um caminho alternativo quando a condição inicial é falsa.

    # Exemplo: Verificação de balneabilidade de uma praia
                                    situacao_da_praia = "Regular"
    
                                    if situacao_da_praia == "Boa":
                                        print("Status: Praia liberada para banho.")
                                    else:
                                        print("Status: Praia com restrições. Verifique a qualidade da água.")
  3. if/elif/else: avalia múltiplas possibilidades sem repetir comparações.

    # Exemplo: Simbolização de um mapa de declividade
                                    declividade = 12  # em graus
                                    simbologia = ""  # Inicializa a variável
    
                                    if declividade < 5:
                                        simbologia = "Verde (Plano)"
                                    elif declividade < 20:  # Só é testado se o primeiro if for falso
                                        simbologia = "Amarelo (Suavemente Ondulado)"
                                    elif declividade < 45:  # Só é testado se os anteriores forem falsos
                                        simbologia = "Laranja (Ondulado)"
                                    else:  # Se nenhuma das condições acima for atendida
                                        simbologia = "Vermelho (Forte Ondulado/Montanhoso)"
    
                                    print(f"A simbologia para a declividade de {declividade}° é: {simbologia}")

3.2.2 Combinando Condições com Operadores Lógicos

Quando uma decisão depende de vários fatores, use and, or e not para construir filtros mais precisos.

  • and exige que todas as condições sejam verdadeiras.
  • or aceita que uma condição verdadeira já satisfaça o teste.
  • not inverte o resultado, útil para checar ausências.
altura_do_poste = 10.5
                                material = "Madeira"
                                necessita_reparo = False

                                # Exemplo com 'and': ambas as condições precisam ser verdadeiras
                                if altura_do_poste > 9.0 and material == "Madeira":
                                    print("Alerta: Poste de madeira alto. Prioridade máxima para substituição!")

                                # Exemplo com 'or': basta uma condição verdadeira
                                if altura_do_poste > 10.0 or necessita_reparo:
                                    print("Ação necessária: Enviar equipe de manutenção para inspeção.")

                                # Exemplo com 'not': executa quando a condição é falsa
                                if not necessita_reparo:
                                    print("Status do poste: Operacional, nenhum reparo necessário no momento.")

3.2.3 ifs Aninhados: Uma Decisão Dentro da Outra

Estruturas aninhadas permitem criar funis de decisão, analisando primeiro um cenário geral e, em seguida, detalhes específicos.

# Exemplo: Análise de uso do solo em uma área de preservação
                                bioma = "Mata Atlântica"
                                nivel_regeneracao = "Avançado"

                                if bioma == "Mata Atlântica":
                                    print("Analisando área dentro da Mata Atlântica.")
    
                                    # Este 'if' aninhado só é verificado se o primeiro for verdadeiro
                                    if nivel_regeneracao == "Avançado":
                                        print("-> Ação: Área prioritária para conservação integral.")
                                    elif nivel_regeneracao == "Inicial":
                                        print("-> Ação: Área elegível para projetos de restauração.")
                                    else:
                                        print("-> Ação: Monitorar e avaliar.")
                                else:
                                    print("Área fora do bioma de interesse para este projeto.")

3.2.4 if de Uma Linha (Operador Ternário)

Para atribuições simples, utilize a forma resumida valor_if if condição else valor_else, mantendo o código enxuto e legível.

temperatura = 28
                                altitude = 1200

                                # Atribui "Ensolarado" se a temperatura for maior que 25, senão "Ameno"
                                clima = "Ensolarado" if temperatura > 25 else "Ameno"
                                risco = "Alto" if altitude > 1000 else "Baixo"

                                print(f"O clima está: {clima}")
                                print(f"O risco de deslizamento é considerado: {risco}")

3.3 Estruturas de Repetição: Automatizando Tarefas com Loops

Loops poupam esforço repetitivo, permitindo processar milhares de arquivos, linhas ou feições com poucas linhas de código.

3.3.1 O Laço for: Percorrendo Sequências

O for é a ferramenta padrão para iterar sobre listas, tuplas, dicionários e outros iteráveis. Ele cuida do contador internamente, reduzindo erros e tornando o código mais claro.

For básico: percorrendo uma lista

# Lista com nomes de arquivos raster a serem processados
                                arquivos_raster = ["imagem_2022.tif", "imagem_2023.tif", "imagem_2024.tif"]

                                print("Iniciando o processamento de imagens...")
                                for nome_do_arquivo in arquivos_raster:
                                    print(f"- Processando o arquivo: {nome_do_arquivo}")
                                    # Aqui entraria o código para abrir, reclassificar ou salvar o raster
                                print("Processamento concluído.")

Repetindo um número fixo de vezes com range()

# Exemplo 1: Contagem regressiva
                                print("Contagem regressiva para lançamento do satélite:")
                                for i in range(5, 0, -1):  # Começa em 5, termina em 1
                                    print(i)

                                # Exemplo 2: Gerando múltiplos buffers
                                print("\nGerando buffers com diferentes distâncias:")
                                for distancia in range(50, 501, 50):  # De 50 a 500, de 50 em 50 metros
                                    print(f"- Criando buffer de {distancia} metros.")

Obtendo o índice e o valor com enumerate()

# Lista de vértices de um polígono
                                vertices = [(-48.5, -27.1), (-48.4, -27.1), (-48.4, -27.0)]

                                for indice, coordenada in enumerate(vertices):
                                    print(f"Vértice {indice}: Coordenadas {coordenada}")

Percorrendo dicionários com .items()

# Dicionário com metadados de uma imagem de satélite
                                metadados = {
                                    "satelite": "Landsat 9",
                                    "data_captura": "2024-10-26",
                                    "resolucao_m": 30
                                }

                                print("Metadados da Imagem:")
                                for chave, valor in metadados.items():
                                    print(f"- {chave.replace('_', ' ').capitalize()}: {valor}")

3.3.2 O Laço while: Enquanto a condição for verdadeira

Use while quando não souber quantas repetições serão necessárias, mas conhecer a condição de permanência. Lembre-se de atualizar essa condição dentro do loop para evitar laços infinitos.

Validação de entrada de dados

# Exemplo: Validando a entrada de uma altitude positiva
                                while True:  # Inicia um loop aparentemente infinito
                                    entrada = input("Digite uma altitude (em metros): ")
                                    try:
                                        altitude = float(entrada)
                                        if altitude > 0:
                                            break  # Sai do loop se a verificação der certo
                                        else:
                                            print("Erro: A altitude deve ser um número positivo.")
                                    except ValueError:
                                        print("Erro: Entrada inválida. Por favor, digite um número.")

                                print(f"Altitude válida inserida: {altitude}m")

Simulação operacional

# Exemplo: Simulação de bateria de um drone em campo
                                bateria_restante = 100
                                uso_por_hora = 15
                                horas_de_voo = 0

                                print("Iniciando operação do drone...")
                                while bateria_restante > 20:  # Condição de parada
                                    print(f"Hora {horas_de_voo}: Bateria em {bateria_restante}%. Operando normalmente.")
                                    bateria_restante -= uso_por_hora  # Atualiza a condição!
                                    horas_de_voo += 1

                                print(f"Fim da operação na hora {horas_de_voo}. Bateria em {bateria_restante}%. Nível crítico. Retornando para a base.")

3.3.3 Controlando o Fluxo dos Loops: break e continue

Essas palavras-chave permitem interromper um loop ou pular a iteração atual, dando mais controle sobre a execução.

break: Saída de emergência

# Procurando pelo primeiro setor censitário com população acima de 1000
                                setores = [
                                    {"id": "A", "pop": 750},
                                    {"id": "B", "pop": 1200},
                                    {"id": "C", "pop": 900},
                                ]

                                for setor in setores:
                                    print(f"Analisando setor {setor['id']}...")
                                    if setor['pop'] > 1000:
                                        print(f"Encontrado! O setor {setor['id']} tem população de {setor['pop']}.")
                                        break  # Para o loop assim que o primeiro for encontrado

continue: Pulando para o próximo item

# Processando uma lista de arquivos, mas ignorando os que não são shapefiles
                                arquivos = ["dados.shp", "relatorio.txt", "mapa.shp", "backup.zip"]

                                for arquivo in arquivos:
                                    if not arquivo.endswith(".shp"):
                                        continue  # Pula para o próximo arquivo

                                    # Este código só será executado para os arquivos .shp
                                    print(f"Processando o shapefile: {arquivo}")

3.4 Conclusão

Com estruturas de decisão e repetição, seu código ganha autonomia: analisa cenários, reage a dados e executa rotinas extensas com poucos comandos. Esses recursos são a base para criar pipelines inteligentes de análise espacial, processamento de imagens e integração com APIs.

No próximo capítulo, combinaremos coleções, decisões e loops com funções para modularizar scripts e construir ferramentas reutilizáveis.